// Listing 15.9
// Using typedef to make pointers to functions more readable
#include <iostream>
using namespace std;

void Square(int&, int&);
void Cube(int&, int&);
void Swap(int&, int&);
void GetVals(int&, int&);
typedef void (*VPF)(int&, int&);
void PrintVals(VPF,int&,int&);

int main(void)
{
    int valOne = 1;
    int valTwo = 2;
    int choice;
    bool fQuit = false;

    VPF pFunc;
    while(fQuit = false)
    {
        cout << "(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: ";
        cin >> choice;
        switch(choice)
        {
            case 1:
                pFunc = GetVals;
                break;
            case 2:
                pFunc = Square;
                break;
            case 3:
                pFunc = Cube;
                break;
            case 4:
                pFunc = Swap;
                break;
            default:
                fQuit = true;
                break;
        }
    }
    return 0;
}


void Square(int& rX, int& rY)
{
    rX *= rX;
    rY *= rY;
}

void Cube(int& rX, int& rY)
{
    int tmp;
    tmp = rX;
    rX *= rX;
    rX = rX * tmp;
}

void Swap(int& rX, int& rY)
{
    int temp;
    temp = rX;
    rX = rY;
    rY = temp;
}

void GetVals(int& rValOne, int& rValTwo)
{
    cout << "New value for ValOne: ";
    cin >> rValOne;
    cout << "New value for ValTwo: ";
    cin >> rValTwo;
}
